#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QkeyEvent>
#include<Qtimer>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

//首先定义方向
typedef enum Direct{
    DIR_LEFT,
    DIR_RIGHT,
    DIR_UP,
    DIR_DOWN
}dir_t;

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();


    //我们需要两条蛇，这是两条蛇的运动函数声明
    void moveSnake(int direction);
    void moveSnake2(int direction);

protected:
    //渲染，绘图
    void paintEvent(QPaintEvent *event);
    void growSnake(int direction);
    void growSnake2(int direction);

    //蛇的运动函数
    void addTop();
    void addDown();
    void addRight();
    void addLeft();
    void addTop2();
    void addDown2();
    void addRight2();
    void addLeft2();

    //蛇吃小球的函数
    void addNewReward();

    //对于按键的设置WSAD与上下左右两个玩家
    void keyPressEvent(QKeyEvent *event) ;

    //删除末尾，配合上ADD就是运动
    void deleteLast();
    void deleteLast2();

    //绘制两条蛇，共用一个函数
    void drawSnake(QPainter &painter, const QList<QRectF> &snake, QColor color);
private:
    Ui::Widget *ui;
    //设定两条蛇初始方向都是向上的
    int moveFlag=DIR_UP;
    int moveFlag2=DIR_UP;


    //设计定时器，开始游戏之前是暂停的
    bool gameStart=false;

    //用以判断游戏的输赢的函数
    enum GameResult {
        GameRunning,
        PurpleWins,
        GreenWins,
        Draw
    };

    GameResult gameResult = GameRunning;

    //检查游戏是否结束
    bool checkContact() {
        // 检查紫蛇的头是否与绿蛇的任何部分相撞
        for (int i = 0; i < snake2.length(); i++) {
            if (snake[0].intersects(snake2[i])) {
                gameResult = GreenWins;  // 绿蛇赢了
                return true;
            }
        }

        // 检查绿蛇的头是否与紫蛇的任何部分相撞
        for (int j = 0; j < snake.length(); j++) {
            if (snake2[0].intersects(snake[j])) {
                gameResult = PurpleWins;  // 紫蛇赢了
                return true;
            }
        }

        // 检查紫蛇的头是否与自己的身体相撞
            for (int k = 1; k < snake.length(); k++) {
                if (snake[0].intersects(snake[k])) {
                    gameResult = GreenWins;  // 因为紫蛇自撞，绿蛇赢了
                    return true;
                }
            }

            // 检查绿蛇的头是否与自己的身体相撞
            for (int l = 1; l < snake2.length(); l++) {
                if (snake2[0].intersects(snake2[l])) {
                    gameResult = PurpleWins;  // 因为绿蛇自撞，紫蛇赢了
                    return true;
                }
            }

        // 检查是否是头对头相撞
        if (snake[0].intersects(snake2[0])) {
            gameResult = Draw;  // 平局
            return true;
        }

        return false;
    }



    //定时器
    QTimer *timer;
    int time=100;//超时时间间隔，毫秒

    //蛇
    QList<QRectF>snake;
    QList<QRectF> snake2;  // 第二条蛇的身体部分


    //小球
    QRectF rewardNode;

    //小方块的宽高
    int nodeWidth=20;
    int nodeHeight=20;

protected slots:
    void timeout();
};


#endif // WIDGET_H
